/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package easyscore;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Scaredevil
 */
public class Jogo {
    
    Cronometro _cronometro;
    Equipa _equipa1;
    Equipa _equipa1_backup;
    Equipa _equipa2;
    Equipa _equipa2_backup;
    boolean _run = false;
    
    public Jogo(){
        _equipa1 = new Equipa();
        _equipa2 = new Equipa();
        _cronometro = new Cronometro();
    }
    
    public void adicionarFalta(int equipa, int numero, int tempo, Jogador.TipoFalta falta){
        Gravar();
        Jogador jgdr;
        switch(equipa){
            case 1:
                jgdr = _equipa1.GetJogador(numero);
                if(jgdr != null){
                    _equipa1.AdicionarFalta();
                    jgdr.adicionarFalta(tempo, falta);
                }
                break;
            case 2:
                jgdr = _equipa2.GetJogador(numero);
                if(jgdr != null){
                    _equipa2.AdicionarFalta();
                    jgdr.adicionarFalta(tempo, falta);
                }
                break;
            default:
                break;
        }
    }
    
    public void Pausar(){
        _cronometro.pause();
    }
    
    public void Iniciar(){
        _cronometro.play();
    }
    
    public void AdicionarJogador(int equipa, Jogador jogador){
        //Gravar();
        switch(equipa){
            case 1:
                _equipa1.AdicionarJogador(jogador);
                break;
            case 2:
                _equipa2.AdicionarJogador(jogador);
                break;
        }
    }
    
    public void Update(){
//        while(_run){
//            _cronometro.Update();
//            //System.out.print("update.");
//        }
        _cronometro.Update();
    }
    
    public void adicionarPonto(int equipa, int pontos){
        Gravar();
        switch(equipa){
            case 1:
                _equipa1.AdicionarPontos(pontos);
                break;
            case 2:
                _equipa2.AdicionarPontos(pontos);
                break;
        }
    }
    
    public void timeout(int equipa){
        switch(equipa){
            case 1:
                if(_equipa1.getTimeouts() <= 0)
                    return;
                
                if(!_cronometro.isModoTimeout()){
                    _equipa1.UseTimeout();
                    _cronometro.setModoTimeout(true);
                }else{
                    _cronometro.setModoTimeout(false);
                }
                break;
            case 2:
                if(_equipa2.getTimeouts() <= 0)
                    return;
                
                if(!_cronometro.isModoTimeout()){
                    _equipa2.UseTimeout();
                    _cronometro.setModoTimeout(true);
                }else{
                    _cronometro.setModoTimeout(false);
                }
                break;
        }
    }
    
    public int getTimeout(){
        return _cronometro.getTempoTimeout();
    }
    
    public void tempoataque(){
        _cronometro.resetTempoAtaque();
    }
    
    public String getTempo(){
        return ""+_cronometro.getTempoJogoMin()+":"+_cronometro.getTempoJogoSeg()+"";
    }
    
    public int getTempoMin()
    {
        return _cronometro.getTempoJogoMin();
    }
    
    public int getTempoSeg()
    {
        return _cronometro.getTempoJogoSeg();
    }
    
    public int getParte(){
        return _cronometro.GetParte();
    }
    
    public int getTempoAtaque(){
        return _cronometro.getTempoAtaque();
    }
    
    public String getJogadores(int equipa){
        switch(equipa){
            case 1:
                break;
            case 2:
                break;
        }
        return null;
    }
    
    public int getFaltasEquipa(int equipa)
    {
        switch(equipa)
        {
            case 1: return _equipa1.GetFaltas();
            case 2: return _equipa2.GetFaltas();
        }
        return 0;
    }
    
    public int getTimeoutsEquipa(int equipa)
    {
        switch(equipa)
        {
            case 1: return _equipa1.getTimeouts();
            case 2: return _equipa2.getTimeouts();
        }
        return 0;
    }
    
    public int getFaltas(int equipa, int numero){
        switch(equipa){
            case 1:
                return _equipa1.GetJogador(numero).GetNumeroFaltas();
            case 2:
                return _equipa2.GetJogador(numero).GetNumeroFaltas();
        }
        return 0;
    }
    
    public int getPontos(int equipa){
        switch(equipa){
            case 1:
                return _equipa1.GetPontos();
            case 2:
                return _equipa2.GetPontos();
        }
        return 0;
    }
    
    public void Desfazer(){
        if(_equipa1_backup == null || _equipa2_backup == null)
            return;
        _equipa1 = _equipa1_backup;
        _equipa2 = _equipa2_backup;
        _equipa1_backup = null;
        _equipa2_backup = null;
    }
    
    public int getNumJogadores(int equipa)
    {
        if(equipa==1)
            return _equipa1.GetNumeroJogadores();
        if (equipa==2)
            return _equipa2.GetNumeroJogadores();
        return 0;
    }
    
    public int getFaltasJogador(int equipa, int index)
    {
        if(equipa==1)
            return _equipa1.GetFaltasJogador(index);
        if (equipa==2)
            return _equipa2.GetFaltasJogador(index);
        return 0;
    }
    
    
    void Gravar(){
//        /*
//            Caso isto não funcione correctamente, será necessário clonar cada jogador dentro da class Equipa. Mas como não tenho a certeza. Fix it lattter... \(◕◡◕)/
//        */
//        try {
//            _equipa1_backup = (Equipa)_equipa1.clone();
//        } catch (CloneNotSupportedException ex) {
//            Logger.getLogger(Jogo.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        try {
//            _equipa2_backup = (Equipa)_equipa2.clone();
//        } catch (CloneNotSupportedException ex) {
//            Logger.getLogger(Jogo.class.getName()).log(Level.SEVERE, null, ex);
//        }
    }
    
    public boolean existJogador(int equipa, int numero){
        switch(equipa){
            case 1:
                if(_equipa1.GetJogador(numero)!=null)
                    return true;
            case 2:
                if(_equipa2.GetJogador(numero)!=null)
                    return true;
        }
        return false;
    }
}
